# -*- coding: utf-8 -*-
"""
@Time    : 2024/9/13 16:13 
@Author  : ZhangShenao 
@File    : 6.类的多态.py 
@Desc    : 类的多态

子类在继承了后,可以对父类已有的方法给出新的实现版本,这个动作称之为方法重写(override)
通过方法重写,我们可以让父类的同一个行为在子类中拥有不同的实现版本
当我们调用这个经过子类重写的方法时,不同的子类对象会表现出不同的行为
这个就是多态:poly-morphism
"""
from abc import ABC, abstractmethod


# 定义抽象父类
# 通过继承ABC类,可以定义一个抽象类
# 抽象类无法被实例化
# 它存在的意义就是让子类去继承,并重写它的抽象方法
class Pet(ABC):
    """抽象宠物父类"""

    def __init__(self, name: str, age: int):
        """构造函数"""

        # 初始化父类属性
        self._name = name
        self._age = age

    # 使用@abstractmethod装饰器,声明抽象方法,要求子类重写
    @abstractmethod
    def bark(self):
        """抽象方法:宠物叫"""

        pass


# 定义子类
class Dog(Pet):
    """小狗类,继承Pet抽象父类"""

    def __init__(self, name: str, age: int):
        """构造方法"""

        # 执行父类的构造方法
        super().__init__(name, age)

    def bark(self):
        print(f"小狗 {self._name} 正在汪汪叫")


class Cat(Pet):
    """小猫类,继承Pet抽象父类"""

    def __init__(self, name: str, age: int):
        """构造方法"""

        # 执行父类的构造方法
        super().__init__(name, age)

    def bark(self):
        print(f"小猫 {self._name} 正在喵喵叫")


if __name__ == '__main__':
    # 实现多态
    dog: Pet = Dog(name="大黄", age=2)
    dog.bark()

    cat: Pet = Cat(name="小花", age=1)
    cat.bark()
